package cn.tedu.ivos.base.exception;

import cn.tedu.ivos.base.response.JsonResult;
import cn.tedu.ivos.base.response.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 *   1.如果抛出了异常,首先看是否定义了全局异常处理器
 *   2.如果定义了局异常处理器，会在全局异常处理器中找对应的异常处理方法
 *   3.如果找到了对应的异常处理方法,则执行异常处理方法中的代码逻辑
 */
@Slf4j // 使用Lombok的@Slf4j注解，自动生成日志对象log
@RestControllerAdvice // 使用Spring的@RestControllerAdvice注解，表示该类是一个全局异常处理类,方便返回统一格式的错误响应
public class GlobalExceptionHandler {
     /*
      ExceptionHandler注解:表示方法为具体的异常处理方法;需要一个异常处理类型的形式参数;
      1.优先查找该控制器异常对应的异常处理方法;
      2.如果没有对应的异常处理方法,则会找父类的异常处理方法;
      3.如果没有父类的异常处理方法,则会走SpringMVC自己的异常处理机制;
     */

    @ExceptionHandler
    public JsonResult doHandleServiceException(ServiceException ex) {
        //如果出现了业务层异常,打印错误日志,显示当前错误状态码的描述信息
        //如:ServiceException:员工名已被占用
        log.error("ServiceException:" + ex.getStatusCode().getMsg());
        //返回JsonResult格式的错误响应，包含详细的状态码对象
        return new JsonResult(ex.getStatusCode());
    }

    @ExceptionHandler
    public JsonResult doHandleIllegalArgumentException(IllegalArgumentException ex) {
        //获取非法参数异常的详细错误信息
        String message = ex.getMessage();
        //记录日志，输出异常信息
        log.error("IllegalArgumentException: " + message);
        //返回JsonResult格式的错误响应，包含操作失败的状态码对象以及详细错误信息
        return new JsonResult(StatusCode.OPERATION_FAILED, message);
    }
}